package com.koron.housing.apply.bean.dto;

import com.koron.housing.apply.bean.po.HousingStaffHonor;
import com.koron.housing.apply.bean.po.HousingStaffIntegral;
import com.koron.housing.apply.bean.po.HousingStaffRank;
import com.koron.housing.apply.bean.vo.HousingStaffApplyVO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.Date;
import java.util.List;

/**
 * @author jzp
 * @since 2022/2/26
 */
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel(value = "需求申请详情页信息", description = "HousingStaffApplyDTO")
public class HousingStaffApplyDTO extends HousingStaffApplyVO {

    @ApiModelProperty("职称信息")
    private List<HousingStaffRank> rankList;

    @ApiModelProperty("工作荣誉")
    private List<HousingStaffHonor> honorList;

    @ApiModelProperty("积分信息")
    private HousingStaffIntegral integral;

    /**
     * 计算积分信息
     * 企业人才住房分配评分细则：
     *  学历：本科1 研究生4 博士8 博士后12
     *  企业工龄：0-5年5  6-10年3  11年以上0
     *  职称：初级1  中级2    高级3
     *  荣誉：公司先进工作者1  集团各类先进工作者2 公司标兵3 区级荣誉2 市级荣誉3 省级荣誉4 国家级荣誉5
     */
    public void computeIntegral() {
        if (integral == null) {
            integral = new HousingStaffIntegral();
        }
        integral.setApplyId(getId());
        integral.setAge(getAge());
        integral.setEdu(getEdu());
        integral.setHonor(getHonors());
        integral.setRank(getRanks());
    }

    /**
     * 获取学历积分
     * key  value   integral
     * 2    本科       1
     * 3    研究生     4
     * 4    博士       8
     * 5    博士后     12
     */
    private int getEdu() {
        String fullTimeEdu = getFullTimeEdu();
        return StringUtils.isEmpty(fullTimeEdu) ? 0 :
                ("2".equals(fullTimeEdu) ? 1 :
                        ("3".equals(fullTimeEdu) ? 4 :
                                ("4".equals(fullTimeEdu) ? 8 :
                                        ("5".equals(fullTimeEdu) ? 12 :
                                                0))));
    }

    /**
     * 获取企业工龄积分
     * value   integral
     * 0-5年      5
     * 6-10年     3
     * 11年以上    0
     */
    private int getAge() {
        // 计算企业工龄
        Date entryDate = getEntryDate(); // 入职日期
        if (entryDate == null) {
            return 0;
        }
        Date date = new Date();
        int age = (int) ((date.getTime() - entryDate.getTime()) / 1000 / 60 / 60 / 24 / 365);
        return age <= 5 ? 5 : (age <= 10 ? 3 : 0);
    }

    /**
     * 获取职称积分
     * key  value   integral
     * 0    初级       1
     * 1    中级       2
     * 2    高级       3
     */
    private int getRanks() {
        if (CollectionUtils.isEmpty(rankList)) {
            return 0;
        }
        return rankList.stream()
                .map(HousingStaffRank::getLevel)
                .map(e -> Integer.parseInt(e) + 1)
                .reduce(Integer::sum)
                .orElse(0);
    }

    /**
     * 荣誉：公司先进工作者1  集团各类先进工作者2 公司标兵3 区级荣誉2 市级荣誉3 省级荣誉4 国家级荣誉5
     * key  value               integral
     * 0    公司先进工作者             1
     * 1    集团各类先进工作者          2
     * 2    公司标兵                  3
     * 3    区级荣誉                  2
     * 4    市级荣誉                  3
     * 5    省级荣誉                  4
     * 6    国家级荣誉                5
     */
    private int getHonor(String name) {
        return StringUtils.isEmpty(name) ? 0 :
                ("0".equals(name) ? 1 :
                        ("1".equals(name) ? 2 :
                                ("2".equals(name) ? 3 :
                                        ("3".equals(name) ? 2 :
                                                ("4".equals(name) ? 3 :
                                                        ("5".equals(name) ? 4 :
                                                                ("6".equals(name) ? 5 :
                                                                        0)))))));
    }

    private int getHonors() {
        if (CollectionUtils.isEmpty(honorList)) {
            return 0;
        }
        return honorList.stream()
                .map(HousingStaffHonor::getName)
                .map(this::getHonor)
                .reduce(Integer::sum)
                .orElse(0);
    }

}
